package services

import "github.com/sirupsen/logrus"

/*
//45	startTime1	//	开启时间1   小时（1字节）
//46		//	开启时间1   分钟（1字节）
//47	endTime1	//	关闭时间1   小时（1字节）
//48		//	关闭时间1   分钟（1字节）
//49	sprayDuration1	//	喷淋时间1    小时（1字节）
//50		//	喷淋时间1    分钟（1字节）
//51		//	喷淋时间1    秒（1字节）
//52	intervalTime1	//	间隔时间1   小时（1字节）
//53		//	间隔时间1    分钟（1字节）
//54		//	间隔时间1    秒（1字节）
//55	sprayLevel1	//	喷淋档位1    档（1字节）
//56	particleSize1	//	颗粒粗细1      %（1字节）
//57	weekSwitch1	//	星期开关1     1字节8个位，1~7位分别代表星期一到星期日
//58	timePeriod1Allowed	//	时间段1允许   0代表本段时间禁止  1代表本段时间允许
//59	startTime2	//	开启时间2   小时（1字节）
//60		//	开启时间2  分钟（1字节）
//61	endTime2	//	关闭时间2   小时（1字节）
//62		//	关闭时间2   分钟（1字节）
//63	sprayDuration2	//	喷淋时间2    小时（1字节）
//64		//	喷淋时间2    分钟（1字节）
//65		//	喷淋时间2   秒（1字节）
//66	intervalTime2	//	间隔时间2   小时（1字节）
//67		//	间隔时间2    分钟（1字节）
//68		//	间隔时间2    秒（1字节）
//69	sprayLevel2	//	喷淋档位2    档（1字节）
//70	particleSize2	//	颗粒粗细2      %（1字节）
//71	weekSwitch2	//	星期开关2     1字节8个位，1~7位分别代表星期一到星期日
//72	timePeriod2Allowed	//	时间段2允许   0代表本段时间禁止  1代表本段时间允许
//73	startTime3	//	开启时间3  小时（1字节）
//74		//	开启时间3  分钟（1字节）
//75	endTime3	//	关闭时间3   小时（1字节）
//76		//	关闭时间3   分钟（1字节）
//77	sprayDuration3	//	喷淋时间3    小时（1字节）
//78		//	喷淋时间3    分钟（1字节）
//79		//	喷淋时间3   秒（1字节）
//80	intervalTime3	//	间隔时间3   小时（1字节）
//81		//	间隔时间3    分钟（1字节）
//82		//	间隔时间3    秒（1字节）
//83	sprayLevel3	//	喷淋档位3    档（1字节）
//84	particleSize3	//	颗粒粗细3      %（1字节）
//85	weekSwitch3	//	星期开关3     1字节8个位，1~7位分别代表星期一到星期日
//86	timePeriod3Allowed	//	时间段3允许   0代表本段时间禁止  1代表本段时间允许
//87	autoMode	//	自动模式
//88	autoHumidityMin	//	自动模式湿度下限
//89	autoHumidityMax	//	自动模式湿度上限
//90	minInterval	//	最小间歇时间
//91	compHumidityMin	//	补偿模式湿度下限
//92	compHumidityMax	//	补偿模式湿度上限
//93	compModeSwitch	//	补偿模式开关
//94	firstCurrentThresh	//	第一电流阀值
//95	secondCurrentThresh	//	第二电流阀值
//96	solenoidMode	//	电磁阀工作模式
//97	intelliMode	//	智能工作模式 0 传感器  1 跟随电气
//98	compCoeff		补偿系数
*/

var SpkCtrlT1ParamsMap = map[string]DataRule{
	"startTime1":          {StartAddr: 45, Length: 2},
	"endTime1":            {StartAddr: 47, Length: 2},
	"sprayDuration1":      {StartAddr: 49, Length: 3},
	"intervalTime1":       {StartAddr: 52, Length: 3},
	"sprayLevel1":         {StartAddr: 55, Length: 1},
	"particleSize1":       {StartAddr: 56, Length: 1},
	"weekSwitch1":         {StartAddr: 57, Length: 1},
	"timePeriod1Allowed":  {StartAddr: 58, Length: 1},
	"startTime2":          {StartAddr: 59, Length: 2},
	"endTime2":            {StartAddr: 61, Length: 2},
	"sprayDuration2":      {StartAddr: 63, Length: 3},
	"intervalTime2":       {StartAddr: 66, Length: 3},
	"sprayLevel2":         {StartAddr: 69, Length: 1},
	"particleSize2":       {StartAddr: 70, Length: 1},
	"weekSwitch2":         {StartAddr: 71, Length: 1},
	"timePeriod2Allowed":  {StartAddr: 72, Length: 1},
	"startTime3":          {StartAddr: 73, Length: 2},
	"endTime3":            {StartAddr: 75, Length: 2},
	"sprayDuration3":      {StartAddr: 77, Length: 3},
	"intervalTime3":       {StartAddr: 80, Length: 3},
	"sprayLevel3":         {StartAddr: 83, Length: 1},
	"particleSize3":       {StartAddr: 84, Length: 1},
	"weekSwitch3":         {StartAddr: 85, Length: 1},
	"timePeriod3Allowed":  {StartAddr: 86, Length: 1},
	"autoMode":            {StartAddr: 87, Length: 1},
	"autoHumidityMin":     {StartAddr: 88, Length: 1},
	"autoHumidityMax":     {StartAddr: 89, Length: 1},
	"minInterval":         {StartAddr: 90, Length: 1},
	"compHumidityMin":     {StartAddr: 91, Length: 1},
	"compHumidityMax":     {StartAddr: 92, Length: 1},
	"compModeSwitch":      {StartAddr: 93, Length: 1},
	"firstCurrentThresh":  {StartAddr: 94, Length: 1},
	"secondCurrentThresh": {StartAddr: 95, Length: 1},
	"solenoidMode":        {StartAddr: 96, Length: 1},
	"intelliMode":         {StartAddr: 97, Length: 1},
	"compCoeff":           {StartAddr: 98, Length: 1},
}

type SpkCtrlT1Params struct {
	StartTime1          string `json:"startTime1"`
	EndTime1            string `json:"endTime1"`
	SprayDuration1      string `json:"sprayDuration1"`
	IntervalTime1       string `json:"intervalTime1"`
	SprayLevel1         uint8  `json:"sprayLevel1"`
	ParticleSize1       uint8  `json:"particleSize1"`
	WeekSwitch1         uint8  `json:"weekSwitch1"`
	TimePeriod1Allowed  uint8  `json:"timePeriod1Allowed"`
	StartTime2          string `json:"startTime2"`
	EndTime2            string `json:"endTime2"`
	SprayDuration2      string `json:"sprayDuration2"`
	IntervalTime2       string `json:"intervalTime2"`
	SprayLevel2         uint8  `json:"sprayLevel2"`
	ParticleSize2       uint8  `json:"particleSize2"`
	WeekSwitch2         uint8  `json:"weekSwitch2"`
	TimePeriod2Allowed  uint8  `json:"timePeriod2Allowed"`
	StartTime3          string `json:"startTime3"`
	EndTime3            string `json:"endTime3"`
	SprayDuration3      string `json:"sprayDuration3"`
	IntervalTime3       string `json:"intervalTime3"`
	SprayLevel3         uint8  `json:"sprayLevel3"`
	ParticleSize3       uint8  `json:"particleSize3"`
	WeekSwitch3         uint8  `json:"weekSwitch3"`
	TimePeriod3Allowed  uint8  `json:"timePeriod3Allowed"`
	AutoMode            uint8  `json:"autoMode"`
	AutoHumidityMin     uint8  `json:"autoHumidityMin"`
	AutoHumidityMax     uint8  `json:"autoHumidityMax"`
	MinInterval         uint8  `json:"minInterval"`
	CompHumidityMin     uint8  `json:"compHumidityMin"`
	CompHumidityMax     uint8  `json:"compHumidityMax"`
	CompModeSwitch      uint8  `json:"compModeSwitch"`
	FirstCurrentThresh  uint8  `json:"firstCurrentThresh"`
	SecondCurrentThresh uint8  `json:"secondCurrentThresh"`
	SolenoidMode        uint8  `json:"solenoidMode"`
	IntelliMode         uint8  `json:"intelliMode"`
	CompCoeff           uint8  `json:"compCoeff"`
}

// 喷淋控制器时间段1事件 method:SPK_CTRL_T1
type SpkCtrlT1Event struct {
	Method string          `json:"method"`
	Params SpkCtrlT1Params `json:"params"`
}

// 喷淋控制器时间段1命令组装并发送给设备
func AssembleSpkCtrlT1Payload(mac string, method string, params map[string]interface{}) error {
	var byteList []ByteData
	// 给params中的数据按照startAddr排序
	for k, v := range params {
		logrus.Info("k:", k, "v:", v)
		// 是否存在k
		if _, ok := SpkCtrlT1ParamsMap[k]; ok {
			byteList = append(byteList, ByteData{
				StartAddr: SpkCtrlT1ParamsMap[k].StartAddr,
				Length:    SpkCtrlT1ParamsMap[k].Length,
				Value:     v,
			})
		}
	}
	logrus.Info("未排序的byteList:", byteList)
	err := AssembleCommandPayloadByByteData(mac, method, byteList)
	return err
}
